package com.magic.process;

import com.magic.dto.MeetingDTO;
import com.magic.enums.MeetingEventEnum;
import com.magic.handler.MeetingHelper;

import java.util.List;

/**
 * @author magic
 * @version 1.0
 * @date 2022/2/22 14:53
 */
public interface IMeetingEvent<T> {
  MeetingEventEnum currentEvent(T param);

  MeetingHelper[] execute(MeetingEventEnum eventEnum, MeetingHelper ...helpers);

  MeetingHelper[] preExecute(T param);

  IMeetingEvent bindEventOperator(List<IMeetingOperator> operatorList);


  MeetingDTO[] executeEvent(T param);

  /**
   * 会议预约事件
   *
   * @param <T>
   */
  interface ReserveEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 申请待审批会议事件
   *
   * @param <T>
   */
  interface ApplyEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议审批通过事件
   *
   * @param <T>
   */
  interface AuditEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议审批拒绝事件
   *
   * @param <T>
   */
  interface RejectEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议修改事件（审批拒绝修改）
   *
   * @param <T>
   */
  interface ModifyEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议更新事件（非审批会议）
   *
   * @param <T>
   */
  interface UpdateEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议取消事件
   *
   * @param <T>
   */
  interface CancelEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议同步事件
   *
   * @param <T>
   */
  interface SyncEvent<T> extends IMeetingEvent<T> {
  }

  /**
   * 会议同步新增事件
   *
   * @param <T>
   */
  interface SyncReserveEvent<T> extends IMeetingEvent<T> {
  }

  /**
   * 会议同步更新事件
   *
   * @param <T>
   */
  interface SyncUpdateEvent<T> extends IMeetingEvent<T> {
  }

  /**
   * 会议开始事件
   *
   * @param <T>
   */
  interface StartEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议延长事件
   *
   * @param <T>
   */
  interface ExtendEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议结束时间
   *
   * @param <T>
   */
  interface EndEvent<T> extends IMeetingEvent<T> {
  }


  /**
   * 会议签到事件
   *
   * @param <T>
   */
  interface CheckInEvent<T> extends IMeetingEvent<T> {
  }

  /**
   * 会议提醒事件
   * @param <T>
   */
  interface NoticeEvent<T> extends IMeetingEvent<T> {
  }

  /**
   * 会议室维护事件
   * @param <T>
   */
  interface RoomMaintain<T> extends IMeetingEvent<T> {

  }

  /**
   * 会议室停止事件
   * @param <T>
   */
  interface RoomStopUse<T> extends IMeetingEvent<T> {

  }
}
